/**
 * \file md5.h
 * \brief Prototypes des fonctions de génération de la clé MD5 contenues dans md5.c
 * \author Ronald Rivest
 * 
 * Ce fichier contient les prototypes des fonctions de
 * génération de la clé MD5. C'est l'include de md5.c
 *
 */


#ifndef MD5_H
#define MD5_H

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include "../include.h"

//#define PORTMIN 20000 /*!< Numéro de port minimal pour le transfert*/
//#define PORTMAX 30000 /*!< Numéro de port maximal pour le transfert */
//#define QUEUE 5 /*!< Longueur de la file d'attente pour l'écoute */
//#define MAXBUFF 2000 /*!< Taille maximale du buffer d'envoi */
//#define NB_FICHIERS 2048 /*!< Nombre de fichiers dans la table de fichiers */
#define REPERTOIRE_SHARED ".." /*!< Répertoire où sont situés les fichiers */
#define REPERTOIRE_SRC ".." /*!< Répertoire où est situé le code */
#define MD5_REPERTOIRE "../md5/" /*!< Répertoire où est situé le code de MD5 */
#define TAILLE_MD5 16 /*!< Taille de la clé MD5 */
//#define NOM_FICHIER_TEMP "fichier_temporaire" /*!<Nom du fichier temporaire pour l'envoi */
//#define TAILLE_NOM_FICHIER 255 /*!<Longueur maximale du nom d'un fichier*/
//#define MAX 512


/* WARNING :
 * This implementation is using 32 bits long values for sizes
 */
typedef unsigned int md5_size;

/* MD5 context */
struct md5_ctx {
	struct {
		unsigned int A, B, C, D; /* registers */
	} regs;
	unsigned char *buf;
	md5_size size;
	md5_size bits;
};

/* Size of the MD5 buffer */
#define MD5_BUFFER 1024

/* Basic md5 functions */
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (~z & y))
#define H(x,y,z) (x ^ y ^ z)
#define I(x,y,z) (y ^ (x | ~z))

/* Rotate left 32 bits values (words) */
#define ROTATE_LEFT(w,s) ((w << s) | ((w & 0xFFFFFFFF) >> (32 - s)))

#define FF(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + F(b,c,d) + x + t), s))
#define GG(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + G(b,c,d) + x + t), s))
#define HH(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + H(b,c,d) + x + t), s))
#define II(a,b,c,d,x,s,t) (a = b + ROTATE_LEFT((a + I(b,c,d) + x + t), s))

unsigned char *md5 (unsigned char *, md5_size, unsigned char *);
void md5_init (struct md5_ctx *);
void md5_update (struct md5_ctx *context);
void md5_final (unsigned char *digest, struct md5_ctx *context);


/**
 * \brief Calcule la clé avec les fonctions MD5
 *
 * Cette fonction permet de récupérer la clé d'un fichier dont le
 * file descriptor a été passé en paramètre et de la mettre
 * dans un buffer.
 *
 * \param f Descripteur du fichier
 * \param ctx Structure md5 à remplir par les fonctions md5
 * \param clef Tableau de caractères qui contiendra la clé
 * \return void
 */
void MDFile (FILE *f, struct md5_ctx *ctx,unsigned char clef[TAILLE_MD5]);
/**
 * \brief Renvoie la clé d'un fichier grâce à son nom
 *
 * Cette fonction permet de récupérer la clé d'un fichier dont le
 * nom a été passé en paramètre.
 *
 * \param nom_fichier Nom du fichier
 * \param clef Le tableau de paramètres dans lequel on va mettre la clé
 * \return 0 tout le temps.

 */
int cle (char * nom_fichier, unsigned char * clef);


/**
 * \brief Transforme la clé MD5 en une chaîne de caractères valables
 *
 * Cette fonction permet de récupérer la clé en chaîne de caractères
 * au lieu de unsigned chars (02x)
 * \param clef_char la chaîne de caractères à remplir
 * \param clef_bits la clé en 02x
 * \return void.
 */

void transforme_cle (char* clef_char, unsigned char *clef_bits);


/**
 * \brief Utilise l'encodage MD5 sur un buffer.
 * 
 * Permet de trouver l'encodage MD5 d'un buffer
 * et non d'un fichier (nécessaire au transfert 
 * par blocs). 
 *
 * \param chaine Buffer à encoder
 * \param len Taille du contexte MD5
 * \param clef Chaîne de caractères
 * 
 * \return void.
 */
void md5sum(const char *chaine, size_t len, char * clef);

int md5_compare(char * clef1, char * clef2);
int md5_fichier(char * nom_fichier, char * clef);

#endif /* MD5_H */
